From 4e2e0191c851bbd98053f851568c495f4382ca1c Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 00:29:24 +0200 Subject: [PATCH] Move cargo_rustc::compile_targets() to Context::compile() --- src/cargo/ops/cargo_compile.rs | 2 +- src/cargo/ops/cargo_rustc/context/mod.rs | 159 ++++++++++++++++++++++- src/cargo/ops/cargo_rustc/mod.rs | 156 +--------------------- src/cargo/ops/mod.rs | 2 +- 4 files changed, 160 insertions(+), 159 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 59a9e0275..fc2c1c3d7 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -355,7 +355,7 @@ pub fn compile_ws<'a>( build_config, profiles, )?; - ops::compile_targets(cx, &package_targets, export_dir.clone(), &exec)? + cx.compile(&package_targets, export_dir.clone(), &exec)? }; ret.to_doc_test = to_builds.into_iter().cloned().collect(); diff --git a/src/cargo/ops/cargo_rustc/context/mod.rs b/src/cargo/ops/cargo_rustc/context/mod.rs index 17238595f..757c25587 100644 --- a/src/cargo/ops/cargo_rustc/context/mod.rs +++ b/src/cargo/ops/cargo_rustc/context/mod.rs @@ -14,11 +14,12 @@ use util::{internal, profile, Cfg, CfgExpr, Config}; use util::errors::{CargoResult, CargoResultExt}; use super::TargetConfig; -use super::custom_build::{BuildDeps, BuildScripts, BuildState}; +use super::custom_build::{self, BuildDeps, BuildScripts, BuildState}; use super::fingerprint::Fingerprint; +use super::job_queue::JobQueue; use super::layout::Layout; use super::links::Links; -use super::{BuildConfig, Compilation, Kind}; +use super::{BuildConfig, Compilation, Executor, Kind, PackagesToBuild}; mod unit_dependencies; use self::unit_dependencies::build_unit_dependencies; @@ -153,6 +154,160 @@ impl<'a, 'cfg> Context<'a, 'cfg> { Ok(cx) } + // Returns a mapping of the root package plus its immediate dependencies to + // where the compiled libraries are all located. + pub fn compile( + mut self, + pkg_targets: &'a PackagesToBuild<'a>, + export_dir: Option, + exec: &Arc, + ) -> CargoResult> { + let units = pkg_targets + .iter() + .flat_map(|&(pkg, ref targets)| { + let default_kind = if self.build_config.requested_target.is_some() { + Kind::Target + } else { + Kind::Host + }; + targets.iter().map(move |&(target, profile)| Unit { + pkg, + target, + profile, + kind: if target.for_host() { + Kind::Host + } else { + default_kind + }, + }) + }) + .collect::>(); + + let mut queue = JobQueue::new(&self); + self.prepare_units(export_dir, &units)?; + self.prepare()?; + self.build_used_in_plugin_map(&units)?; + custom_build::build_map(&mut self, &units)?; + + for unit in units.iter() { + // Build up a list of pending jobs, each of which represent + // compiling a particular package. No actual work is executed as + // part of this, that's all done next as part of the `execute` + // function which will run everything in order with proper + // parallelism. + super::compile(&mut self, &mut queue, unit, exec)?; + } + + // Now that we've figured out everything that we're going to do, do it! + queue.execute(&mut self)?; + + for unit in units.iter() { + for output in self.outputs(unit)?.iter() { + if output.flavor == FileFlavor::DebugInfo { + continue; + } + + let bindst = match output.hardlink { + Some(ref link_dst) => link_dst, + None => &output.path, + }; + + if unit.profile.test { + self.compilation.tests.push(( + unit.pkg.clone(), + unit.target.kind().clone(), + unit.target.name().to_string(), + output.path.clone(), + )); + } else if unit.target.is_bin() || unit.target.is_example() { + self.compilation.binaries.push(bindst.clone()); + } else if unit.target.is_lib() { + let pkgid = unit.pkg.package_id().clone(); + self.compilation + .libraries + .entry(pkgid) + .or_insert_with(HashSet::new) + .insert((unit.target.clone(), output.path.clone())); + } + } + + for dep in self.dep_targets(unit).iter() { + if !unit.target.is_lib() { + continue; + } + + if dep.profile.run_custom_build { + let out_dir = self.files().build_script_out_dir(dep).display().to_string(); + self.compilation + .extra_env + .entry(dep.pkg.package_id().clone()) + .or_insert_with(Vec::new) + .push(("OUT_DIR".to_string(), out_dir)); + } + + if !dep.target.is_lib() { + continue; + } + if dep.profile.doc { + continue; + } + + let outputs = self.outputs(dep)?; + self.compilation + .libraries + .entry(unit.pkg.package_id().clone()) + .or_insert_with(HashSet::new) + .extend( + outputs + .iter() + .map(|output| (dep.target.clone(), output.path.clone())), + ); + } + + let feats = self.resolve.features(unit.pkg.package_id()); + if !feats.is_empty() { + self.compilation + .cfgs + .entry(unit.pkg.package_id().clone()) + .or_insert_with(|| { + feats + .iter() + .map(|feat| format!("feature=\"{}\"", feat)) + .collect() + }); + } + let rustdocflags = self.rustdocflags_args(unit)?; + if !rustdocflags.is_empty() { + self.compilation + .rustdocflags + .entry(unit.pkg.package_id().clone()) + .or_insert(rustdocflags); + } + + super::output_depinfo(&mut self, unit)?; + } + + for (&(ref pkg, _), output) in self.build_state.outputs.lock().unwrap().iter() { + self.compilation + .cfgs + .entry(pkg.clone()) + .or_insert_with(HashSet::new) + .extend(output.cfgs.iter().cloned()); + + self.compilation + .extra_env + .entry(pkg.clone()) + .or_insert_with(Vec::new) + .extend(output.env.iter().cloned()); + + for dir in output.library_paths.iter() { + self.compilation.native_dirs.insert(dir.clone()); + } + } + self.compilation.target = self.target_triple().to_string(); + Ok(self.compilation) + } + pub fn prepare_units( &mut self, export_dir: Option, diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 4da9dbe61..5380f70bd 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -1,4 +1,4 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::env; use std::ffi::{OsStr, OsString}; use std::fs; @@ -146,160 +146,6 @@ pub struct DefaultExecutor; impl Executor for DefaultExecutor {} -// Returns a mapping of the root package plus its immediate dependencies to -// where the compiled libraries are all located. -pub fn compile_targets<'a, 'cfg: 'a>( - mut cx: Context<'a, 'cfg>, - pkg_targets: &'a PackagesToBuild<'a>, - export_dir: Option, - exec: &Arc, -) -> CargoResult> { - let units = pkg_targets - .iter() - .flat_map(|&(pkg, ref targets)| { - let default_kind = if cx.build_config.requested_target.is_some() { - Kind::Target - } else { - Kind::Host - }; - targets.iter().map(move |&(target, profile)| Unit { - pkg, - target, - profile, - kind: if target.for_host() { - Kind::Host - } else { - default_kind - }, - }) - }) - .collect::>(); - - let mut queue = JobQueue::new(&cx); - cx.prepare_units(export_dir, &units)?; - cx.prepare()?; - cx.build_used_in_plugin_map(&units)?; - custom_build::build_map(&mut cx, &units)?; - - for unit in units.iter() { - // Build up a list of pending jobs, each of which represent - // compiling a particular package. No actual work is executed as - // part of this, that's all done next as part of the `execute` - // function which will run everything in order with proper - // parallelism. - compile(&mut cx, &mut queue, unit, exec)?; - } - - // Now that we've figured out everything that we're going to do, do it! - queue.execute(&mut cx)?; - - for unit in units.iter() { - for output in cx.outputs(unit)?.iter() { - if output.flavor == FileFlavor::DebugInfo { - continue; - } - - let bindst = match output.hardlink { - Some(ref link_dst) => link_dst, - None => &output.path, - }; - - if unit.profile.test { - cx.compilation.tests.push(( - unit.pkg.clone(), - unit.target.kind().clone(), - unit.target.name().to_string(), - output.path.clone(), - )); - } else if unit.target.is_bin() || unit.target.is_example() { - cx.compilation.binaries.push(bindst.clone()); - } else if unit.target.is_lib() { - let pkgid = unit.pkg.package_id().clone(); - cx.compilation - .libraries - .entry(pkgid) - .or_insert_with(HashSet::new) - .insert((unit.target.clone(), output.path.clone())); - } - } - - for dep in cx.dep_targets(unit).iter() { - if !unit.target.is_lib() { - continue; - } - - if dep.profile.run_custom_build { - let out_dir = cx.files().build_script_out_dir(dep).display().to_string(); - cx.compilation - .extra_env - .entry(dep.pkg.package_id().clone()) - .or_insert_with(Vec::new) - .push(("OUT_DIR".to_string(), out_dir)); - } - - if !dep.target.is_lib() { - continue; - } - if dep.profile.doc { - continue; - } - - let outputs = cx.outputs(dep)?; - cx.compilation - .libraries - .entry(unit.pkg.package_id().clone()) - .or_insert_with(HashSet::new) - .extend( - outputs - .iter() - .map(|output| (dep.target.clone(), output.path.clone())), - ); - } - - let feats = cx.resolve.features(unit.pkg.package_id()); - if !feats.is_empty() { - cx.compilation - .cfgs - .entry(unit.pkg.package_id().clone()) - .or_insert_with(|| { - feats - .iter() - .map(|feat| format!("feature=\"{}\"", feat)) - .collect() - }); - } - let rustdocflags = cx.rustdocflags_args(unit)?; - if !rustdocflags.is_empty() { - cx.compilation - .rustdocflags - .entry(unit.pkg.package_id().clone()) - .or_insert(rustdocflags); - } - - output_depinfo(&mut cx, unit)?; - } - - for (&(ref pkg, _), output) in cx.build_state.outputs.lock().unwrap().iter() { - cx.compilation - .cfgs - .entry(pkg.clone()) - .or_insert_with(HashSet::new) - .extend(output.cfgs.iter().cloned()); - - cx.compilation - .extra_env - .entry(pkg.clone()) - .or_insert_with(Vec::new) - .extend(output.env.iter().cloned()); - - for dir in output.library_paths.iter() { - cx.compilation.native_dirs.insert(dir.clone()); - } - } - cx.compilation.target = cx.target_triple().to_string(); - Ok(cx.compilation) -} - fn compile<'a, 'cfg: 'a>( cx: &mut Context<'a, 'cfg>, jobs: &mut JobQueue<'a>, diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 86822b3d1..01aec3011 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -2,7 +2,7 @@ pub use self::cargo_clean::{clean, CleanOptions}; pub use self::cargo_compile::{compile, compile_with_exec, compile_ws, CompileOptions}; pub use self::cargo_compile::{CompileFilter, CompileMode, FilterRule, MessageFormat, Packages}; pub use self::cargo_read_manifest::{read_package, read_packages}; -pub use self::cargo_rustc::{compile_targets, Compilation, Kind, Unit}; +pub use self::cargo_rustc::{Compilation, Kind, Unit}; pub use self::cargo_rustc::{is_bad_artifact_name, Context}; pub use self::cargo_rustc::{BuildConfig, BuildOutput, TargetConfig}; pub use self::cargo_rustc::{DefaultExecutor, Executor}; -- 2.30.2